package com.coder.algorithm.offer_2;

import com.coder.algorithm.struct.BinaryTreeNode;

/**
 * 二叉树的镜像
 *
 * @author yuhushuan
 * @date 2020/6/19 21:43
 */
public class _27_1_MirrorOfBinaryTree {

    private static void mirror_Recursively(BinaryTreeNode node) {
        if (node == null) {
            return;
        }
        // 交换子节点
        if (node.left != null || node.right != null) {
            BinaryTreeNode temp = node.left;
            node.left = node.right;
            node.right = temp;
        }
        mirror_Recursively(node.left);
        mirror_Recursively(node.right);
    }

    public static void main(String[] args) {
        // 功能测试
        // 普通二叉树
        test1();
        // 二叉树所有节点都没有左子树
        // 二叉树所有节点都没有右子树
        // 只有一个节点的二叉树

        // 特殊输入测试
        // 二叉树的根节点为 null
    }

    private static void test1() {
        BinaryTreeNode A = new BinaryTreeNode(8);

        BinaryTreeNode a2_8 = new BinaryTreeNode(8);
        BinaryTreeNode a2_7 = new BinaryTreeNode(7);

        BinaryTreeNode a3_9 = new BinaryTreeNode(9);
        BinaryTreeNode a3_2 = new BinaryTreeNode(2);

        BinaryTreeNode a4_4 = new BinaryTreeNode(4);
        BinaryTreeNode a4_7 = new BinaryTreeNode(7);

        A.left = a2_8;
        A.right = a2_7;
        a2_8.left = a3_9;
        a2_8.right = a3_2;
        a3_2.left = a4_4;
        a3_2.right = a4_7;

        print(A);
    }

    private static void print(BinaryTreeNode node) {
        System.out.println("二叉树：");
        BinaryTreeNode.drawBinaryTree(node);

        System.out.println("镜像：");
        mirror_Recursively(node);
        BinaryTreeNode.drawBinaryTree(node);
        System.out.println();
    }
}
